class BravoModel extends Model
{
    //Atribute
    char [][]untergrund;
    char [][]spielfeld;

    Figur figur0;
    Figur figur1;
    Figur figur2;
    Figur figur3;
    Figur figur4;
    Figur figur5;
    Figur figur6;
    Figur figur7;
    Figur figur8;
    Figur figur9;

    //Konstruktor
    BravoModel()
    {
        this.untergrund = new char [42][23];
        this.spielfeld  = new char [42][23];
        for(int x=0; x<42; x++)
        {
            for (int y=0; y<23; y++)
            {
                spielfeld[x][y]= '.';
            }
        }

    }
    //Methoden
    public void start()
    {
        weltErstellen();
        spielerErstellen();
    }

    public  void weltErstellen()
    {
        // Gras setzen
        for(int i=0 ; i<42 ; i++)
        {
            for(int j=0 ; j<23 ; j++)
            {
                objektSetzen(i, j, 'g');
            }
        }

        // Steinweg setzen
        for(int i=0; i<42; i++)
        {    
            for(int j=10; j<13; j++)
            {
                objektSetzen(i, j, 's');
            }
        }
        objektSetzen(20, 8, 's');
        objektSetzen(20, 9, 's');
        objektSetzen(21, 8, 's');
        objektSetzen(21, 9, 's');

        // bau setzen
        for(int i=13; i<29; i++)
        {
            for(int j=0; j<8; j++)
            {
                objektSetzen(i, j, 'i');
            }
        }

        // Mauern setzen
        for(int j=4; j<8; j++)
        {
            objektSetzen(13, j, 'm');
            objektSetzen(28, j, 'm');
        }
        for(int i=13; i<20; i++)
        {
            objektSetzen(i, 7, 'm');
        }
        for(int i=22; i<29; i++)
        {
            objektSetzen(i, 7, 'm');
        }
        objektSetzen(13,0,'m');
        objektSetzen(13,1,'m');
        objektSetzen(28,0,'m');
        objektSetzen(28,1,'m');

        //Kiesweg setzen
        for(int j=0; j<23; j++)
        {
            for(int i=0; i<42; i++)
            {
                //Kiesweg oberhalb des Weges 
                if(j==2&&(i==10||i==11||i==12||i==29||i==30||i==31) || j==3&&(i==9||i==10||i==11||i==12||i==29||i==30||i==31||i==32) || j==4&&(i==8||i==9||i==32||i==33) || j==5&&(i==8||i==9||i==32||i==33) || j==6&&(i==7||i==8||i==9||i==32||i==33||i==34) || j==7&&(i==6||i==7||i==34||i==35) || j==8&&(i==5||i==6||i==35||i==36) || j==9&&(i==5||i==6||i==35||i==36))
                {
                    objektSetzen(i, j, 'k');
                }

                //Kiesweg unterhalb des Weges
                if(j==13&&(i==5||i==6||i==35||i==36) || j==14&&(i==5||i==6||i==34||i==35||i==36) || j==15&&(i==6||i==7||i==33||i==34) || j==16&&(i==7||i==8||i==29||i==30||i==31||i==32||i==33) || j==17&&(i==8||i==9||i==29) || j==18&&(i==9||i==10||i==11||i==12||i==13||i==14||i==15||i==16||i==17||i==18||i==19||i==20||i==29) || j==19&&(i==20||i==21||i==22||i==23||i==24||i==25||i==29) || j==20&&(i==25||i==26||i==27||i==28||i==29))
                {
                    objektSetzen(i, j, 'k');
                }
            }
        }

        //Bäume werden auf der Karte erzeugt
        for(int j=13; j<23; j++)
        {
            for(int i=0; i<42; i++)
            {
                if(j==13&&(i==14||i==23||i==20||i==23) || j==15&&i==13 || j==16&&(i==16||i==24) || j==17&&(i==21||i==30) || j==18&&i==26 || j==19&&i==14 || j==20&&(i==11||i==19|i==23))
                {
                    baumSetzen(i, j);
                }
            }
        }

        //Berg setzen (Falls Textur vorhanden)
        for(int j=18; j<23; j++)
        {
            for(int i=37; i<42; i++)
            {
                objektSetzen(i, j, 'e');
                if(j==18&&(i==37||i==38||i==39) || j==19&&(i==37||i==38) || j==20&&(i==37||i==38) || j==21&&i==37)
                {
                    objektSetzen(i, j, 'g');
                }
            }
        }

        for(int j=9; j<14; j++)
        {
            objektSetzen(0, j, 'w');
            objektSetzen(41, j, 'w');
        }
    }

    public  void spielerErstellen()
    {

        figur0 = new Figur(100,30,7,0,9);
        spielfeld[0][9] = '0';
        view.einheitSetzen(0,9, '0');

        figur1 = new Figur(100,30,7,0,10);
        spielfeld[0][10] = '1';
        view.einheitSetzen(0,10, '1');

        figur2 = new Figur(100,30,7,0,11);
        spielfeld[0][11] = '2';
        view.einheitSetzen(0,11,'2');

        figur3 = new Figur(100,50,10,0,12);
        spielfeld[0][12] = '3';
        view.einheitSetzen(0,12,'3');

        figur4 = new Figur(100,15,5,0,13);
        spielfeld[0][13] = '4';
        view.einheitSetzen(0,13,'4');

        figur5 = new Figur(100,30,7,41,9);
        spielfeld[41][9] = '5';
        view.einheitSetzen(41,9,'5');

        figur6 = new Figur(100,30,7,41,10);
        spielfeld[41][10] = '6';
        view.einheitSetzen(41,10,'6');

        figur7 = new Figur(100,30,7,41,11);
        spielfeld[41][11] = '7';
        view.einheitSetzen(41,11,'7');

        figur8 = new Figur(100,50,10,41,12);
        spielfeld[41][12] = '8';
        view.einheitSetzen(41,12,'8');

        figur9 = new Figur(100,15,5,41,13);
        spielfeld[41][13] = '9';
        view.einheitSetzen(41,13,'9');

    }

    public  void objektSetzen(int x, int y, char objekttyp)
    {
        untergrund[x][y]= objekttyp;
        view.objektSetzen(x, y, objekttyp);
    }

    //Muss rein, da man sonst ewig braucht einen Baum zu erstellen
    public void baumSetzen(int x, int y)
    {
        objektSetzen(x, y, 'a');
        objektSetzen(x+1, y, 'b');
        objektSetzen(x, y+1, 'c');
        objektSetzen(x+1, y+1, 'd');
    }

    public  void einheitSetzen(int x, int y, char objekttyp)
    {
        int a = x;
        int b = y; 

        spielfeld[x][y] = objekttyp;
        view.einheitSetzen(x,y,objekttyp);
        if(objekttyp == '0')
        {
            x= figur0.xGeben();
            y= figur0.yGeben();
            figur0.Koordinate(a,b);
        }
        else if(objekttyp == '1')
        {
            x= figur1.xGeben();
            y= figur1.yGeben();
            figur1.Koordinate(a,b);
        }
        else if(objekttyp == '2')
        {
            x= figur2.xGeben();
            y= figur2.yGeben();
            figur2.Koordinate(a,b);
        }
        else if(objekttyp == '3')
        {
            x= figur3.xGeben();
            y= figur3.yGeben();
            figur3.Koordinate(a,b);
        }
        else if(objekttyp == '4')
        {
            x= figur4.xGeben();
            y= figur4.yGeben();
            figur4.Koordinate(a,b);
        }
        else if(objekttyp == '5')
        {
            x= figur5.xGeben();
            y= figur5.yGeben();
            figur5.Koordinate(a,b);
        }
        else if(objekttyp == '6')
        {
            x= figur6.xGeben();
            y= figur6.yGeben();
            figur6.Koordinate(a,b);
        }
        else if(objekttyp == '7')
        {
            x= figur7.xGeben();
            y= figur7.yGeben();
            figur7.Koordinate(a,b);
        }
        else if(objekttyp == '8')
        {
            x= figur8.xGeben();
            y= figur8.yGeben();
            figur8.Koordinate(a,b);
        }
        else if(objekttyp == '9')
        {
            x= figur9.xGeben();
            y= figur9.yGeben();
            figur9.Koordinate(a,b);
        }

        view.einheitSetzen(x,y,'.');
        spielfeld[x][y] = '.';

    }

    //Gesundheit der Einheiten:
    public void angreifen(int schaden, char figur)
    {
        if(figur == '0')
        {
            figur0.schaden(schaden);
            if(figur0.gesundheitGeben() < 0)
            {
                //Spielfigur Stirbt
            }
            view.gesundheitAendern( 0 , figur0.staerkeGeben());
        }
        else if(figur == '1')
        {
            figur1.schaden(schaden);
            view.gesundheitAendern( 1 , figur1.staerkeGeben()); 
        }
        else if(figur == '2')
        {
            figur2.schaden(schaden);
            view.gesundheitAendern( 2 , figur2.staerkeGeben());
        }
        else if(figur == '3')
        {
            figur3.schaden(schaden);
            view.gesundheitAendern( 3 , figur3.staerkeGeben());
        }
        else if(figur == '4')
        {
            figur4.schaden(schaden);
            view.gesundheitAendern( 4 , figur4.staerkeGeben());
        }
        else if(figur == '5')
        {
            figur5.schaden(schaden);
            view.gesundheitAendern( 5 , figur5.staerkeGeben());
        }
        else if(figur == '6')
        {
            figur6.schaden(schaden);
            view.gesundheitAendern( 6 , figur6.staerkeGeben());
        }
        else if(figur == '7')
        {
            figur7.schaden(schaden);
            view.gesundheitAendern( 7 , figur7.staerkeGeben());
        }
        else if(figur == '8')
        {
            figur8.schaden(schaden);
            view.gesundheitAendern( 8 , figur8.staerkeGeben());
        }
        else if(figur == '9')
        {
            figur9.schaden(schaden);
            view.gesundheitAendern( 9 , figur9.staerkeGeben());
        }

    }

    public char spielfeldAusgeben(int x, int y)
    {
        return spielfeld[x][y];
    }

    public char untergrundAusgeben(int x, int y)
    {
        return untergrund[x][y];
    }

    public void reset()
    {
        einheitSetzen(0, 0, '0');
        einheitSetzen(0, 9, '0');
        figur0.gesundheitReset();

        einheitSetzen(0, 0, '1');
        einheitSetzen(0, 10, '1');
        figur1.gesundheitReset();

        einheitSetzen(0, 0, '2');
        einheitSetzen(0, 11, '2');
        figur2.gesundheitReset();

        einheitSetzen(0, 0, '3');
        einheitSetzen(0, 12, '3');
        figur3.gesundheitReset();

        einheitSetzen(0, 0, '4');
        einheitSetzen(0, 13, '4');
        figur4.gesundheitReset();

        einheitSetzen(0, 0, '5');
        einheitSetzen(41, 9, '5');
        figur5.gesundheitReset();

        einheitSetzen(0, 0, '6');
        einheitSetzen(41, 10, '6');
        figur6.gesundheitReset();

        einheitSetzen(0, 0, '7');
        einheitSetzen(41, 11, '7');
        figur7.gesundheitReset();

        einheitSetzen(0, 0, '8');
        einheitSetzen(41, 12, '8');
        figur8.gesundheitReset();

        einheitSetzen(0, 0, '9');
        einheitSetzen(41, 13, '9');
        figur9.gesundheitReset();

        for(int i = 0; i<42; i++)
        {
            for(int o = 0; o<23; o++)
            {
                if(spielfeld[i][o] == 'r')
                {
                    reichweiteSetzen(i, o, '.');
                }
            }
        }

        view.gesundheitsReset();
    }

    public Figur figurGeben(int nummer)
    {
        if(nummer==0)return figur0;
        else if(nummer==1)return figur1;
        else if(nummer==2)return figur2;
        else if(nummer==3)return figur3;
        else if(nummer==4)return figur4;
        else if(nummer==5)return figur5;
        else if(nummer==6)return figur6;
        else if(nummer==7)return figur7;
        else if(nummer==8)return figur8;
        else return figur9;
    }

    public void spielfeldDurchsuchen(char z)
    {
        for (int i=0; i>43; i++)
        {
        }
    }

    public void reichweiteSetzen(int x, int y, char objekttyp)
    {
        spielfeld[x][y] = objekttyp;
        view.einheitSetzen(x,y,objekttyp);
    }

}